package interfaces;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.ConcurrentModificationException;

import javax.swing.JPanel;

import componentes.Alvo;
import componentes.Aviao;
import componentes.Projetil;

/**
 * 
 * Classe PainelFase.java que representa o painel que conterá os elementos de
 * uma fase, como o avião, os projéteis e os alvos
 * 
 * @desc Projeto BombarJ
 * @author Simone Carneiro Streitenberger 11888 CCO2003
 * @author Thiago Nascimento Comicio 11889 CCO2003
 * @professor Edison de Jesus
 * @disciplina Computação Gráfica 2 - CCO812
 * 
 */
public class PainelFase extends JPanel {
	private static final long serialVersionUID = 1L;

	// elementos da fase
	private Aviao aviao;

	private ArrayList<Projetil> projeteis;

	private ArrayList<Alvo> alvos;

	// verificação de pause
	private boolean pause;

	// indica de será impressa a fase atual, utilizado no início de cada fase
	private int fase = -1;

	// cor da fase
	private Color corFase;

	// imprime a mensagem de término de jogo
	private boolean terminaJogo;

	// imprime a mensagem de que o jogador ganhou o jogo
	private boolean ganhaJogo;

	/**
	 * 
	 * Construtor da classe PainelFase.java
	 * 
	 */
	public PainelFase() {
		// inicia os arraylists que conterão os projeteis e os alvos
		projeteis = new ArrayList<Projetil>();
		alvos = new ArrayList<Alvo>();

		// indica que a fase não está pausada
		pause = false;
	}

	/**
	 * 
	 * Método que tem por função setar o avião que será impresso na tela
	 * 
	 * @param aviao
	 *            Avião que será impresso na tela.
	 * 
	 */
	public void setAviao(Aviao aviao) {
		this.aviao = aviao;
	}

	/**
	 * 
	 * Método que tem por função adicionar um novo alvo a ser impresso na tela
	 * 
	 * @param alvo
	 *            Novo alvo a ser impresso na tela.
	 * 
	 */
	public void addAlvo(Alvo alvo) {
		this.alvos.add(alvo);
	}

	/**
	 * 
	 * Método que tem por função remover todos os alvos
	 * 
	 */
	public void removeAlvos() {
		this.alvos.clear();
	}

	/**
	 * 
	 * Método que tem por função adicionar um novo projétil a ser impresso
	 * 
	 * @param projetil
	 *            Novo projétil a ser impresso
	 * 
	 */
	public void addProjetil(Projetil projetil) {
		this.projeteis.add(projetil);
	}

	/**
	 * 
	 * 
	 * Método que tem por função
	 * 
	 * @param projetil
	 * 
	 */
	public void removeProjetil(Projetil projetil) {
		this.projeteis.remove(projetil);
	}

	/**
	 * 
	 * Método que tem por função remover todos os projéteis
	 * 
	 */
	public void removeProjeteis() {
		this.projeteis.clear();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see javax.swing.JComponent#paint(java.awt.Graphics)
	 */
	public void paint(Graphics desenho) {
		super.paint(desenho);

		// verifica se não houve modificação concorrente que possa gerar erro
		try {
			// pinta todos os projeteis
			for (Projetil projetil : projeteis)
				if (projetil != null)
					projetil.pintaProjetil(desenho);

			// pinta todos os alvos
			for (Alvo alvo : alvos)
				if (alvo != null)
					alvo.pintaAlvo(desenho);

			// pinta o avião na tel
			if (aviao != null)
				aviao.pintaAviao(desenho);

			// pinta a indicação de fase
			if (fase != -1) {
				desenho.setColor(Color.BLACK);
				desenho.setFont(new Font("Dialog", java.awt.Font.BOLD, 48));
				desenho.drawString("FASE " + fase, 202,
						this.getHeight() / 2 - 48);
				desenho.setColor(corFase);
				desenho.drawString("FASE " + fase, 200,
						this.getHeight() / 2 - 50);
			}

			// pinta a indicação de fase
			if (pause == true) {
				desenho.setColor(Color.BLACK);
				desenho.setFont(new Font("Dialog", java.awt.Font.BOLD, 14));
				desenho.drawString(
						"Jogo pausado, pressione <p> para despausar", 130, this
								.getHeight() / 2);
			} else {
				fase = -1;
			}

			// indica o término do jogo
			if (terminaJogo) {
				desenho.setColor(Color.BLACK);
				desenho.setFont(new Font("Dialog", java.awt.Font.BOLD, 60));
				desenho.drawString("FIM DE JOGO ", 102,
						this.getHeight() / 2 - 48);
				desenho.setColor(Color.RED);
				desenho.drawString("FIM DE JOGO", 100,
						this.getHeight() / 2 - 50);
			}

			// indica que o jogador ganhou o jogo
			if (ganhaJogo) {
				desenho.setColor(Color.BLACK);
				desenho.setFont(new Font("Dialog", java.awt.Font.BOLD, 60));
				desenho.drawString("PARABÉNS!!!", 102,
						this.getHeight() / 2 - 48);
				desenho.setColor(new Color(0, 0, 255));
				desenho.drawString("PARABÉNS!!!", 100,
						this.getHeight() / 2 - 50);

				desenho.setColor(Color.BLACK);
				desenho.drawString("VOCÊ VENCEU!", 72,
						this.getHeight() / 2 + 52);
				desenho.setColor(new Color(0, 0, 255));
				desenho.drawString("VOCÊ VENCEU!", 70,
						this.getHeight() / 2 + 50);
			}

		} catch (ConcurrentModificationException e) {
		}
	}

	/**
	 * 
	 * Método que retorna o valor do atributo pause.
	 * 
	 * @return O atributo pause.
	 * 
	 */
	public boolean isPause() {
		return pause;
	}

	/**
	 * 
	 * Método que seta o atributo pause para um novo valor.
	 * 
	 * @param pause
	 *            O atributo pause é setado.
	 * 
	 */
	public void setPause(boolean pause) {
		this.pause = pause;
	}

	/**
	 * 
	 * Método que retorna o valor do atributo corFase.
	 * 
	 * @return O atributo corFase.
	 * 
	 */
	public Color getCorFase() {
		return corFase;
	}

	/**
	 * 
	 * Método que seta o atributo corFase para um novo valor.
	 * 
	 * @param corFase
	 *            O atributo corFase é setado.
	 * 
	 */
	public void setCorFase(Color corFase) {
		this.corFase = corFase;
	}

	/**
	 * 
	 * Método que retorna o valor do atributo fase.
	 * 
	 * @return O atributo fase.
	 * 
	 */
	public int getFase() {
		return fase;
	}

	/**
	 * 
	 * Método que seta o atributo fase para um novo valor.
	 * 
	 * @param fase
	 *            O atributo fase é setado.
	 * 
	 */
	public void setFase(int fase) {
		this.fase = fase;
	}

	public void setTerminaJogo(boolean terminaJogo) {
		this.terminaJogo = terminaJogo;
	}

	public void setGanhaJogo(boolean ganhaJogo) {
		this.ganhaJogo = ganhaJogo;
	}

}
